package DAO.jpa;

import DAO.MovimentacaoDAO;
import Modelo.Usuario;
import Modelo.UsuarioVaga;
import Modelo.Vaga;

import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;
import util.JPAUtil;

public class MovimentacaoJpaDAO extends AbstractJpaDao<UsuarioVaga, Long> implements MovimentacaoDAO {

    public MovimentacaoJpaDAO() {
        super(UsuarioVaga.class);
    }

    @Override
    public List<UsuarioVaga> getAllActives() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<UsuarioVaga> getAll() {
        return JPAUtil.getEntityManager().createQuery("from UsuarioVaga").getResultList();
    }

    @Override
    public List<UsuarioVaga> getByFilters(Usuario usuarioConsulta, Vaga vagaConsulta, UsuarioVaga movimentacaoConsulta) {

        int filters = 0;

        boolean usuarioComFiltros = true;
        boolean vagaComFiltros = true;

        if (isBlank(usuarioConsulta.getNome()) && isBlank(usuarioConsulta.getCpf())) {
            usuarioComFiltros = false;
        }

        if (isBlank(vagaConsulta.getCodigo()) && isBlank(vagaConsulta.getCampus())) {
            vagaComFiltros = false;
        }

        List<UsuarioVaga> retorno = null;

        StringBuilder queryStr = new StringBuilder();

        queryStr.append("SELECT uv FROM UsuarioVaga uv ");

        if (usuarioComFiltros) {
            queryStr.append(" LEFT OUTER JOIN FETCH uv.usuario u ");
        }

        if (vagaComFiltros) {
            queryStr.append(" LEFT OUTER JOIN FETCH uv.vaga v ");
        }

        queryStr.append(" WHERE ");

        if (usuarioComFiltros) {
            
            if (!isBlank(usuarioConsulta.getNome())) {
                
                if (filters > 0) {
                    queryStr.append(" OR ");
                }
                
                queryStr.append(" u.nome like :nome ");
                filters++;
            }
            
            if (!isBlank(usuarioConsulta.getCpf())) {

                if (filters > 0) {
                    queryStr.append(" OR ");
                }

                queryStr.append(" u.cpf = :cpf ");
                filters++;
            }            
        }

        if (vagaComFiltros) {

            if (!isBlank(vagaConsulta.getCodigo())) {

                if (filters > 0) {
                    queryStr.append(" OR ");
                }

                queryStr.append(" v.codigo = :codigo ");
                filters++;
            }

            if (!isBlank(vagaConsulta.getCampus())) {

                if (filters > 0) {
                    queryStr.append(" OR ");
                }

                queryStr.append(" v.campus = :campus ");
                filters++;
            }
        }

        if (!isBlank(movimentacaoConsulta.getTipoVeiculo())) {

            if (filters > 0) {
                    queryStr.append(" OR ");
                }

                queryStr.append(" uv.tipoVeiculo = :tipoVeiculo ");
                filters++;
        }

        if (!isBlank(movimentacaoConsulta.getPlacaVeiculo())) {

            if (filters > 0) {
                    queryStr.append(" OR ");
                }

                queryStr.append(" uv.placaVeiculo = :placaVeiculo ");
                filters++;
        }

        if (!isBlank(movimentacaoConsulta.getDtEntrada())) {

            if (filters > 0) {
                    queryStr.append(" OR ");
                }

                queryStr.append(" uv.dtEntrada = :dtEntrada ");
                filters++;
        }

        if (!isBlank(movimentacaoConsulta.getDtSaida())) {

            if (filters > 0) {
                    queryStr.append(" OR ");
                }

                queryStr.append(" uv.dtSaida = :dtSaida ");
                filters++;
        }

        Query query = JPAUtil.getEntityManager().createQuery(queryStr.toString());

        if (!isBlank(usuarioConsulta.getNome())) {
            query.setParameter("nome", "%" + usuarioConsulta.getNome() + "%");
        }

        if (!isBlank(usuarioConsulta.getCpf())) {
            query.setParameter("cpf", usuarioConsulta.getCpf());
        }

        if (!isBlank(vagaConsulta.getCodigo())) {
            query.setParameter("codigo", vagaConsulta.getCodigo());
        }

        if (!isBlank(vagaConsulta.getCodigo())) {
            query.setParameter("campus", vagaConsulta.getCampus());
        }

        if (!isBlank(movimentacaoConsulta.getTipoVeiculo())) {
            query.setParameter("tipoVeiculo", movimentacaoConsulta.getTipoVeiculo());
        }

        if (!isBlank(movimentacaoConsulta.getPlacaVeiculo())) {
            query.setParameter("placaVeiculo", movimentacaoConsulta.getPlacaVeiculo());
        }

        if (!isBlank(movimentacaoConsulta.getDtEntrada())) {
            query.setParameter("dtEntrada", movimentacaoConsulta.getDtEntrada());
        }

        if (!isBlank(movimentacaoConsulta.getDtSaida())) {
            query.setParameter("dtSaida", movimentacaoConsulta.getDtSaida());
        }

        retorno = query.getResultList();

        return retorno;
    }

    @Override
    public UsuarioVaga getByPrimaryKey(UsuarioVaga usuarioVaga) throws NonUniqueResultException, NoResultException {

        UsuarioVaga retorno = null;

        StringBuilder queryStr = new StringBuilder();

        queryStr.append(" SELECT uv FROM Usuario uv WHERE id = :id ");

        Query query = JPAUtil.getEntityManager().createQuery(queryStr.toString());

        query.setParameter("id", usuarioVaga.getId());

        retorno = (UsuarioVaga) query.getSingleResult();

        return retorno;
    }

    @Override
    public void insert(UsuarioVaga usuarioVaga) {

        JPAUtil.beginTransaction();

        usuarioVaga.setPlacaVeiculo(usuarioVaga.getPlacaVeiculo().toUpperCase());

        persist(usuarioVaga);

        JPAUtil.commitTransaction();
    }

    private boolean isBlank(String str) {
        return (str == null) || (str.trim().equals(""));
    }

//    public List<Aluno> getPorNome(String nome) {
//        String s = "select a from Aluno a where upper(a.nome) like upper(?)";
//        Query query = JPAUtil.getEntityManager().createQuery(s);
//        query.setParameter(1, "%" + nome + "%");
//
//        return (List<Aluno>) query.getResultList();
//    }

//    public Aluno getPorIdComDisciplinas(Long id) {
//        String s = "select a from Aluno a " +
//                   "left outer join fetch a.listaAlunoDisc ad " +
//                   "left outer join fetch ad.disciplina " +
//                   "whusuarios.equals(usuarioCorrente)ere a.id=?";
//        Query query = JPAUtil.getEntityManager().createQuery(s);
//        query.setParameter(1, id);
//
//        return (Aluno) query.getSingleResult();
//    }

//    public Aluno getPorId(Long id) {
//        String s = "select a from Aluno a where a.id=?";
//        Query query = JPAUtil.getEntityManager().createQuery(s);
//        query.setParameter(1, id);
//
//        try {
//            return (Aluno) query.getSingleResult();
//        }
//        catch(NoResultException e) {
//            return null;
//        }
//    }
}